JavaScriptã®éåæã€ãã¬ãŒã¿ãŒãã¹ããªãŒã åŠçã®åŒ·åãªããã©ãŒãã³ã¹ãšã³ãžã³ãšããŠãã°ããŒãã«èŠæš¡ã®ã¢ããªã±ãŒã·ã§ã³ã«ãããããŒã¿ãããŒãã¡ã¢ãªäœ¿çšéãå¿çæ§ãããã«æé©åããããæ¢ããŸãã
JavaScriptã®éåæã€ãã¬ãŒã¿ãŒã»ããã©ãŒãã³ã¹ãšã³ãžã³ãè§£ãæŸã€ïŒã°ããŒãã«èŠæš¡ã§ã®ã¹ããªãŒã åŠçæé©å
仿¥ã®çžäºæ¥ç¶ãããäžçã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã¯åžžã«èšå€§ãªéã®ããŒã¿ãæ±ã£ãŠããŸããé éã®IoTããã€ã¹ããã¹ããªãŒãã³ã°ããããªã¢ã«ã¿ã€ã ã®ã»ã³ãµãŒããŒã¿ãããå€§èŠæš¡ãªéèååŒãã°ã«è³ããŸã§ãå¹ççãªããŒã¿åŠçãæãéèŠã§ããåŸæ¥ã®M ã¢ãããŒãã¯ããªãœãŒã¹ç®¡çã«èŠåŽããããšãå€ããé£ç¶ããç¡å¶éã®ããŒã¿ã¹ããªãŒã ã«çŽé¢ãããšãã¡ã¢ãªã®æ¯æžãããã©ãŒãã³ã¹ã®äœäžã«ã€ãªãããŸããããã§ãJavaScriptã®éåæã€ãã¬ãŒã¿ãŒã匷åãªãããã©ãŒãã³ã¹ãšã³ãžã³ããšããŠç»å Žãã倿§ãªã°ããŒãã«åæ£ã·ã¹ãã å šäœã§ã¹ããªãŒã åŠçãæé©åããããã®æŽç·Žããããšã¬ã¬ã³ããªãœãªã¥ãŒã·ã§ã³ãæäŸããŸãã
ãã®å æ¬çãªã¬ã€ãã§ã¯ãéåæã€ãã¬ãŒã¿ãŒãå埩åããããã¹ã±ãŒã©ãã«ã§ãã¡ã¢ãªå¹çã®é«ãããŒã¿ãã€ãã©ã€ã³ãæ§ç¯ããããã®åºç€ãšãªãã¡ã«ããºã ãã©ã®ããã«æäŸããããæ·±ãæãäžããŸãããã®æ žãšãªãååãå®çšçãªã¢ããªã±ãŒã·ã§ã³ãããã³é«åºŠãªæé©åææ³ããã°ããŒãã«ãªåœ±é¿ãšå®éã®ã·ããªãªã®èŠç¹ããæ¢ããŸãã
æ žãšãªãçè§£ïŒéåæã€ãã¬ãŒã¿ãŒãšã¯ïŒ
ããã©ãŒãã³ã¹ã«é£ã³èŸŒãåã«ãéåæã€ãã¬ãŒã¿ãŒãšã¯äœããæç¢ºã«çè§£ããŸããããECMAScript 2018ã§å°å
¥ããããããã¯ãã銎æã¿ã®åæã€ãã¬ãŒã·ã§ã³ãã¿ãŒã³ïŒfor...ofã«ãŒããªã©ïŒãæ¡åŒµããéåæããŒã¿ãœãŒã¹ãåŠçã§ããããã«ããŸãã
Symbol.asyncIteratorãšfor await...of
ãªããžã§ã¯ããéåæã€ãã©ãã«ã§ãããšèŠãªãããã®ã¯ãSymbol.asyncIteratorãä»ããŠã¢ã¯ã»ã¹å¯èœãªã¡ãœãããæã£ãŠããå Žåã§ãããã®ã¡ãœããã¯ãåŒã³åºããããšéåæã€ãã¬ãŒã¿ãŒãè¿ããŸããéåæã€ãã¬ãŒã¿ãŒã¯ãnext()ã¡ãœãããæã€ãªããžã§ã¯ãã§ã{ value: any, done: boolean }ã®åœ¢åŒã®ãªããžã§ã¯ãã«è§£æ±ºãããPromiseãè¿ããŸããããã¯åæã€ãã¬ãŒã¿ãŒã«äŒŒãŠããŸãããPromiseã§ã©ãããããŠããŸãã
for await...ofã«ãŒãã§éæ³ãèµ·ãããŸãããã®æ§æã䜿çšãããšãéåæã€ãã©ãã«ãå埩åŠçãã忬¡ã®å€ãæºåã§ãããŸã§å®è¡ãäžæåæ¢ããå®è³ªçã«ã¹ããªãŒã å
ã®æ¬¡ã®ããŒã¿ããåŸ
æ©ããããŸãããã®éããããã³ã°ã®æ§è³ªã¯ãI/OããŠã³ãæäœã§ã®ããã©ãŒãã³ã¹ã«ãšã£ãŠéåžžã«éèŠã§ãã
async function* generateAsyncSequence() {
yield await Promise.resolve(1);
yield await Promise.resolve(2);
yield await Promise.resolve(3);
}
async function consumeSequence() {
for await (const num of generateAsyncSequence()) {
console.log(num);
}
console.log("Async sequence complete.");
}
// To run:
// consumeSequence();
ããã§ãgenerateAsyncSequenceã¯éåæãžã§ãã¬ãŒã¿ãŒé¢æ°ã§ãããèªç¶ã«éåæã€ãã©ãã«ãè¿ããŸããæ¬¡ã«ãfor await...ofã«ãŒãã¯ãéåæã§å©çšå¯èœã«ãªã£ãå€ãæ¶è²»ããŸãã
ãããã©ãŒãã³ã¹ãšã³ãžã³ãã®æ¯å©ïŒéåæã€ãã¬ãŒã¿ãŒã¯ããã«å¹çãåäžãããã
ç¶ç¶çãªãªãœãŒã¹ã®æµããåŠçããããã«èšèšãããæŽç·Žããããšã³ãžã³ãæ³åããŠã¿ãŠãã ãããããã¯ãã¹ãŠãäžåºŠã«é£²ã¿èŸŒãã®ã§ã¯ãªããå¿ èŠã«å¿ããŠå¹ççã«ãªãœãŒã¹ãæ¶è²»ãããã®æåéåºŠãæ£ç¢ºã«å¶åŸ¡ããŸããJavaScriptã®éåæã€ãã¬ãŒã¿ãŒãåæ§ã«æ©èœããããŒã¿ã¹ããªãŒã ã®ã€ã³ããªãžã§ã³ããªãããã©ãŒãã³ã¹ãšã³ãžã³ããšããŠåäœããŸãã
- å¶åŸ¡ããããªãœãŒã¹æåïŒ
for await...ofã«ãŒãã¯ã¹ãããã«ãšããŠæ©èœããŸããããŒã¿ãåŠçããæºåãã§ãããšãã«ã®ã¿ããŒã¿ããã«ããã·ã¹ãã ãéå°ãªããŒã¿ã§éè² è·ã«ãªãã®ãé²ããŸãã - éããããã³ã°æäœïŒ 次ã®ããŒã¿ãã£ã³ã¯ãåŸ æ©ããŠããéãJavaScriptã€ãã³ãã«ãŒãã¯ä»ã®ã¿ã¹ã¯ãèªç±ã«åŠçã§ããã¢ããªã±ãŒã·ã§ã³ã®å¿çæ§ã確ä¿ããŸããããã¯ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãšãµãŒããŒã®å®å®æ§ã«ãšã£ãŠéåžžã«éèŠã§ãã
- ã¡ã¢ãªãããããªã³ãã®æé©åïŒ ããŒã¿ã¯ãããŒã¿ã»ããå šäœãã¡ã¢ãªã«ããŒãããã®ã§ã¯ãªããå¢åçã«ãæççã«åŠçãããŸããããã¯ãå€§èŠæš¡ãªãã¡ã€ã«ãç¡å¶éã®ã¹ããªãŒã ãåŠçããäžã§ç»æçãªããšã§ãã
- å埩åãšãšã©ãŒåŠçïŒ é æ¬¡çãªPromiseããŒã¹ã®æ§è³ªã«ãããã¹ããªãŒã å ã§å ç¢ãªãšã©ãŒäŒæãšåŠçãå¯èœã«ãªããæ£åžžãªå埩ãŸãã¯ã·ã£ããããŠã³ãå¯èœã«ãªããŸãã
ãã®ãšã³ãžã³ã«ãããéçºè ã¯ãé å»¶ãããªã¥ãŒã ç¹æ§ã«é¢ä¿ãªããããŸããŸãªã°ããŒãã«ãœãŒã¹ããã®ããŒã¿ãã·ãŒã ã¬ã¹ã«åŠçã§ããå ç¢ãªã·ã¹ãã ãæ§ç¯ã§ããŸãã
ãªãã°ããŒãã«ãªæèã§ã¹ããªãŒã åŠçãéèŠãªã®ã
å¹ççãªã¹ããªãŒã åŠçã®å¿ èŠæ§ã¯ãããŒã¿ãç¡æ°ã®ãœãŒã¹ããçºçãã倿§ãªãããã¯ãŒã¯ã暪æãã確å®ã«åŠçãããªããã°ãªããªãã°ããŒãã«ç°å¢ã§å¢å¹ ãããŸãã
- IoTãšã»ã³ãµãŒãããã¯ãŒã¯ïŒ ãã€ãã®è£œé å·¥å Žããã©ãžã«ã®èŸ²å°ããªãŒã¹ãã©ãªã¢ã®ç°å¢ç£èŠã¹ããŒã·ã§ã³ã«åºããäœçŸäžãã®ã¹ããŒãã»ã³ãµãŒããç¶ç¶çã«ããŒã¿ãéä¿¡ããŠããç¶æ³ãæ³åããŠã¿ãŠãã ãããéåæã€ãã¬ãŒã¿ãŒã¯ãã¡ã¢ãªã飜åãããããéèŠãªæäœããããã¯ãããããããšãªãããããã®çä¿¡ããŒã¿ã¹ããªãŒã ãåŠçã§ããŸãã
- ãªã¢ã«ã¿ã€ã éèååŒïŒ éè¡ãéèæ©é¢ã¯ãããŸããŸãªã¿ã€ã ãŸãŒã³ããçºçããæ¯æ¥äœååãã®ååŒãåŠçããŸããéåæã¹ããªãŒã åŠçã¢ãããŒãã¯ãååŒãå¹ççã«æ€èšŒãèšé²ãããã³èª¿æŽãããé«ãã¹ã«ãŒããããšäœãé å»¶ãç¶æããããšãä¿èšŒããŸãã
- 倧容éãã¡ã€ã«ã®ã¢ããããŒã/ããŠã³ããŒãïŒ äžçäžã®ãŠãŒã¶ãŒããå€§èŠæš¡ãªã¡ãã£ã¢ãã¡ã€ã«ãç§åŠããŒã¿ã»ããããŸãã¯ããã¯ã¢ãããã¢ããããŒãããã³ããŠã³ããŒãããŠããŸããéåæã€ãã¬ãŒã¿ãŒã䜿çšããŠãããã®ãã¡ã€ã«ããã£ã³ã¯ããšã«åŠçããããšã§ããµãŒããŒã®ã¡ã¢ãªæ¯æžãé²ããé²æç¶æ³ã®è¿œè·¡ãå¯èœã«ããŸãã
- APIããŒãžããŒã·ã§ã³ãšããŒã¿åæïŒ ããŒãžåå²ãããAPIïŒäŸïŒã°ããŒãã«æ°è±¡ãµãŒãã¹ããã®éå»ã®æ°è±¡ããŒã¿ããœãŒã·ã£ã«ãã©ãããã©ãŒã ããã®ãŠãŒã¶ãŒããŒã¿ã®ååŸïŒãæ¶è²»ããå Žåãéåæã€ãã¬ãŒã¿ãŒã¯ãååã®ããŒãžãåŠçããããšãã«ã®ã¿æ¬¡ã®ããŒãžãååŸããããšãç°¡çŽ åããããŒã¿ã®æŽåæ§ã確ä¿ãããããã¯ãŒã¯è² è·ã軜æžããŸãã
- ããŒã¿ãã€ãã©ã€ã³ (ETL)ïŒ åæã®ããã«ç°ãªãããŒã¿ããŒã¹ãããŒã¿ã¬ã€ã¯ããå€§èŠæš¡ãªããŒã¿ã»ãããæœåºã倿ãããŒã (ETL) ããããšã¯ãå€ãã®å Žåãå€§èŠæš¡ãªããŒã¿ç§»åã䌎ããŸããéåæã€ãã¬ãŒã¿ãŒã¯ãç°ãªãå°ççããŒã¿ã»ã³ã¿ãŒéã§ãããããã®ãã€ãã©ã€ã³ãå¢åçã«åŠçããããšãå¯èœã«ããŸãã
ãããã®ã·ããªãªãé©åã«åŠçã§ããããšã¯ãããŒã¿ã®çºçå ãéã«é¢ä¿ãªããã¢ããªã±ãŒã·ã§ã³ãã°ããŒãã«ãªãŠãŒã¶ãŒãã·ã¹ãã ã«ãšã£ãŠããã©ãŒãã³ã¹ãé«ããå©çšå¯èœã§ããããšãæå³ããŸãã
éåæã€ãã¬ãŒã¿ãŒã«ããäž»èŠãªæé©ååå
ããã©ãŒãã³ã¹ãšã³ãžã³ãšããŠã®éåæã€ãã¬ãŒã¿ãŒã®çã®åã¯ãããããèªç¶ã«åŒ·å¶ãŸãã¯ä¿é²ããããã€ãã®åºæ¬çãªååã«ãããŸãã
1. é å»¶è©äŸ¡ïŒå¿ èŠã«å¿ããããŒã¿
åæããã³éåæã€ãã¬ãŒã¿ãŒã®æãéèŠãªããã©ãŒãã³ã¹äžã®å©ç¹ã®1ã€ã¯ãé å»¶è©äŸ¡ã§ããããŒã¿ã¯ãã³ã³ã·ã¥ãŒããŒã«ãã£ãŠæç€ºçã«èŠæ±ããããŸã§çæãŸãã¯ãã§ãããããŸãããããã¯æ¬¡ã®ããšãæå³ããŸãã
- ã¡ã¢ãªãããããªã³ãã®åæžïŒ ããŒã¿ã»ããå šäœïŒã®ã¬ãã€ããŸãã¯ãã©ãã€ãã«ãªãå¯èœæ§ãããïŒãã¡ã¢ãªã«ããŒããã代ããã«ãçŸåšåŠçãããŠãããã£ã³ã¯ã®ã¿ãã¡ã¢ãªã«ååšããŸãã
- èµ·åæéã®ççž®ïŒ ã¹ããªãŒã å šäœãæºåãããã®ãåŸ ã€ããšãªããæåã®æ°é ç®ãã»ãŒããã«åŠçã§ããŸãã
- å¹ççãªãªãœãŒã¹äœ¿çšïŒ ã³ã³ã·ã¥ãŒããŒãéåžžã«é·ãã¹ããªãŒã ããå°æ°ã®é ç®ã®ã¿ãå¿ èŠãšããå Žåããããã¥ãŒãµãŒã¯æ©æã«åæ¢ã§ããèšç®ãªãœãŒã¹ãšãããã¯ãŒã¯åž¯åå¹ ãç¯çŽã§ããŸãã
ãµãŒããŒã¯ã©ã¹ã¿ãŒãããã°ãã¡ã€ã«ãåŠçããŠããã·ããªãªãèããŠã¿ãŸããããé å»¶è©äŸ¡ã䜿çšãããšããã°å šäœãããŒãããããšãªãã1è¡ãèªã¿åããåŠçããæ¬¡ã«æ¬¡ã®è¡ãèªã¿åããŸããæ¢ããŠãããšã©ãŒãæ©æã«èŠã€ããå Žåã忢ããããšãã§ããåŠçæéãšã¡ã¢ãªãå€§å¹ ã«ç¯çŽã§ããŸãã
2. èå§åŠçïŒéè² è·ã®é²æ¢
èå§ã¯ã¹ããªãŒã åŠçã«ãããéèŠãªæŠå¿µã§ããããã¯ãã³ã³ã·ã¥ãŒããŒããããã¥ãŒãµãŒã«å¯ŸããŠãããŒã¿ã®åŠçãé ãããŠããããã¥ãŒãµãŒã«é床ãèœãšãå¿ èŠãããããšãéç¥ããèœåã§ããèå§ããªãå Žåãé«éãªãããã¥ãŒãµãŒã¯äœéãªã³ã³ã·ã¥ãŒããŒãå§åãããããã¡ãŒãªãŒããŒãããŒãé å»¶ã®å¢å ãããã³æœåšçãªã¢ããªã±ãŒã·ã§ã³ã¯ã©ãã·ã¥ã«ã€ãªããå¯èœæ§ããããŸãã
for await...ofã«ãŒãã¯ãæ¬è³ªçã«èå§ãæäŸããŸããã«ãŒããé
ç®ãåŠçããawaitã«ééãããšããã®awaitã解決ããããŸã§ã¹ããªãŒã ã®æ¶è²»ãäžæåæ¢ããŸãããããã¥ãŒãµãŒïŒéåæã€ãã¬ãŒã¿ãŒã®next()ã¡ãœããïŒã¯ãçŸåšã®é
ç®ãå®å
šã«åŠçãããã³ã³ã·ã¥ãŒããŒã次ã®é
ç®ãåŸ
æ©ããæºåãã§ãããšãã«ã®ã¿å床åŒã³åºãããŸãã
ãã®æé»ã®èå§ã¡ã«ããºã ã¯ãç¹ã«ãããã¯ãŒã¯ã®ç¶æ ã倧ããå€åããå Žåããé å»¶ãç°ãªãã°ããŒãã«ãªå€æ§ãªãœãŒã¹ããã®ããŒã¿ãåŠçããå Žåã«ãã¹ããªãŒã 管çãå€§å¹ ã«ç°¡çŽ åããŸããããã«ãããå®å®ããäºæž¬å¯èœãªãããŒã確ä¿ããããããã¥ãŒãµãŒãšã³ã³ã·ã¥ãŒããŒã®äž¡æ¹ããªãœãŒã¹æ¯æžããä¿è·ãããŸãã
3. äžŠè¡æ§ vs äžŠåæ§ïŒæé©ãªã¿ã¹ã¯ã¹ã±ãžã¥ãŒãªã³ã°
JavaScriptã¯åºæ¬çã«ã·ã³ã°ã«ã¹ã¬ããã§ãïŒãã©ãŠã¶ã®ã¡ã€ã³ã¹ã¬ããããã³Node.jsã€ãã³ãã«ãŒãå
ïŒãéåæã€ãã¬ãŒã¿ãŒã¯ãå¿çæ§ãç¶æããããã«ïŒWeb WorkersãŸãã¯ã¯ãŒã«ãŒã»ã¹ã¬ããã䜿çšããªãéãïŒçã®äžŠåæ§ã§ã¯ãªãäžŠè¡æ§ã掻çšããŸããawaitããŒã¯ãŒãã¯çŸåšã®éåæé¢æ°ã®å®è¡ãäžæåæ¢ããŸãããJavaScriptã€ãã³ãã«ãŒãå
šäœããããã¯ããããšã¯ãããŸãããããã«ããããŠãŒã¶ãŒå
¥åã®åŠçããããã¯ãŒã¯ãªã¯ãšã¹ãããŸãã¯ä»ã®ã¹ããªãŒã åŠçãªã©ãä»ã®ä¿çäžã®ã¿ã¹ã¯ãç¶è¡ã§ããŸãã
ããã¯ãéãããŒã¿ã¹ããªãŒã ãåŠçããŠããéã§ãã¢ããªã±ãŒã·ã§ã³ãå¿çæ§ãç¶æããããšãæå³ããŸããããšãã°ãWebã¢ããªã±ãŒã·ã§ã³ã¯ãå€§èŠæš¡ãªãããªãã¡ã€ã«ããã£ã³ã¯ããšã«ããŠã³ããŒãããŠåŠçïŒéåæã€ãã¬ãŒã¿ãŒã䜿çšïŒããªããããã©ãŠã¶ãããªãŒãºãããããšãªãããŠãŒã¶ãŒãUIãšå¯Ÿè©±ã§ããããã«ããããšãã§ããŸããããã¯ãèœåã®äœãããã€ã¹ãäœéãªãããã¯ãŒã¯æ¥ç¶ãå©çšããŠããå¯èœæ§ã®ããå€ãã®åœéçãªãŠãŒã¶ãŒã«ãã¹ã ãŒãºãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããããã«äžå¯æ¬ ã§ãã
4. ãªãœãŒã¹ç®¡çïŒæ£åžžãªã·ã£ããããŠã³
éåæã€ãã¬ãŒã¿ãŒã¯ãé©åãªãªãœãŒã¹ã¯ãªãŒã³ã¢ããã®ã¡ã«ããºã ãæäŸããŸããéåæã€ãã¬ãŒã¿ãŒãéšåçã«æ¶è²»ãããå ŽåïŒäŸïŒã«ãŒããéäžã§äžæãããå ŽåããŸãã¯ãšã©ãŒãçºçããå ŽåïŒãJavaScriptã©ã³ã¿ã€ã ã¯ã€ãã¬ãŒã¿ãŒã®ãªãã·ã§ã³ã®return()ã¡ãœãããåŒã³åºãããšããŸãããã®ã¡ãœããã«ãããã€ãã¬ãŒã¿ãŒã¯ããã¡ã€ã«ãã³ãã«ãããŒã¿ããŒã¹æ¥ç¶ããŸãã¯ãããã¯ãŒã¯ãœã±ããã®ã¯ããŒãºãªã©ãå¿
èŠãªã¯ãªãŒã³ã¢ãããå®è¡ã§ããŸãã
åæ§ã«ããªãã·ã§ã³ã®throw()ã¡ãœããã䜿çšããŠãã€ãã¬ãŒã¿ãŒã«ãšã©ãŒãæ¿å
¥ããããšãã§ããŸããããã¯ãã³ã³ã·ã¥ãŒããŒåŽãããããã¥ãŒãµãŒã«åé¡ãéç¥ããå Žåã«åœ¹ç«ã¡ãŸãã
ãã®å ç¢ãªãªãœãŒã¹ç®¡çã¯ããµãŒããŒãµã€ãã¢ããªã±ãŒã·ã§ã³ãIoTã²ãŒããŠã§ã€ã§äžè¬çãªè€éã§é·æéå®è¡ãããã¹ããªãŒã åŠçã·ããªãªã§ãããªãœãŒã¹ããªãŒã¯ããªãããšãä¿èšŒããã·ã¹ãã ã®å®å®æ§ãåäžãããæéã®çµéãšãšãã«ããã©ãŒãã³ã¹ãäœäžããã®ãé²ããŸãã
å®è·µçãªå®è£ ãšäŸ
éåæã€ãã¬ãŒã¿ãŒããå®çšçã§æé©åãããã¹ããªãŒã åŠçãœãªã¥ãŒã·ã§ã³ã«ã©ã®ããã«å€æãããããèŠãŠã¿ãŸãããã
1. 倧容éãã¡ã€ã«ãå¹ççã«èªã¿åã (Node.js)
Node.jsã®fs.createReadStream()ã¯èªã¿åãå¯èœãªã¹ããªãŒã ãè¿ããããã¯éåæã€ãã©ãã«ã§ããããã«ããã倧容éãã¡ã€ã«ã®åŠçãä¿¡ããããªãã»ã©ç°¡åã§ã¡ã¢ãªå¹ççã«ãªããŸãã
const fs = require('fs');
const path = require('path');
async function processLargeLogFile(filePath) {
const stream = fs.createReadStream(filePath, { encoding: 'utf8' });
let lineCount = 0;
let errorCount = 0;
console.log(`Starting to process file: ${filePath}`);
try {
for await (const chunk of stream) {
// In a real scenario, you'd buffer incomplete lines
// For simplicity, we'll assume chunks are lines or contain multiple lines
const lines = chunk.split('\n');
for (const line of lines) {
if (line.includes('ERROR')) {
errorCount++;
console.warn(`Found ERROR: ${line.trim()}`);
}
lineCount++;
}
}
console.log(`\nProcessing complete for ${filePath}.`)
console.log(`Total lines processed: ${lineCount}`);
console.log(`Total errors found: ${errorCount}`);
} catch (error) {
console.error(`Error processing file: ${error.message}`);
}
}
// Example usage (ensure you have a large 'app.log' file):
// const logFilePath = path.join(__dirname, 'app.log');
// processLargeLogFile(logFilePath);
ãã®äŸã§ã¯ã倧容éã®ãã°ãã¡ã€ã«å
šäœãã¡ã¢ãªã«ããŒãããããšãªãåŠçããæ¹æ³ã瀺ããŠããŸããåchunkã¯å©çšå¯èœã«ãªã次第åŠçããããããããŒã¿åæãã¢ãŒã«ã€ãã·ã¹ãã ã§äžççã«äžè¬çãªèª²é¡ã§ãããRAMã«åãŸããªãã»ã©å€§ããªãã¡ã€ã«ã«é©ããŠããŸãã
2. APIå¿çãéåæã§ããŒãžåå²ãã
å€ãã®APIãç¹ã«å€§èŠæš¡ãªããŒã¿ã»ãããæäŸããAPIã¯ãããŒãžããŒã·ã§ã³ã䜿çšããŸããéåæã€ãã¬ãŒã¿ãŒã¯ãåŸç¶ã®ããŒãžã®ãã§ãããèªåçã«åªé ã«åŠçã§ããŸãã
async function* fetchAllPages(baseUrl, initialParams = {}) {
let currentPage = 1;
let hasMore = true;
while (hasMore) {
const params = new URLSearchParams({ ...initialParams, page: currentPage });
const url = `${baseUrl}?${params.toString()}`;
console.log(`Fetching page ${currentPage} from ${url}`);
const response = await fetch(url);
if (!response.ok) {
throw new Error(`API error: ${response.statusText}`);
}
const data = await response.json();
// Assume API returns 'items' and 'nextPage' or 'hasMore'
for (const item of data.items) {
yield item;
}
// Adjust these conditions based on your actual API's pagination scheme
if (data.nextPage) {
currentPage = data.nextPage;
} else if (data.hasOwnProperty('hasMore')) {
hasMore = data.hasMore;
currentPage++;
} else {
hasMore = false;
}
}
}
async function processGlobalUserData() {
// Imagine an API endpoint for user data from a global service
const apiEndpoint = "https://api.example.com/users";
const filterCountry = "IN"; // Example: users from India
try {
for await (const user of fetchAllPages(apiEndpoint, { country: filterCountry })) {
console.log(`Processing user ID: ${user.id}, Name: ${user.name}, Country: ${user.country}`);
// Perform data processing, e.g., aggregation, storage, or further API calls
await new Promise(resolve => setTimeout(resolve, 50)); // Simulate async processing
}
console.log("All global user data processed.");
} catch (error) {
console.error(`Failed to process user data: ${error.message}`);
}
}
// To run:
// processGlobalUserData();
ãã®åŒ·åãªãã¿ãŒã³ã¯ãããŒãžããŒã·ã§ã³ããžãã¯ãæœè±¡åããã³ã³ã·ã¥ãŒããŒãé£ç¶ãããŠãŒã¶ãŒã®ã¹ããªãŒã ã§ãããã®ããã«åã«å埩åŠçã§ããããã«ããŸããããã¯ãç°ãªãã¬ãŒãå¶éãããŒã¿éãæã€å¯èœæ§ã®ãã倿§ãªã°ããŒãã«APIãšçµ±åããå Žåã«éåžžã«è²Žéã§ãããå¹ççã§æºæ ããããŒã¿ååŸãä¿èšŒããŸãã
3. ã«ã¹ã¿ã éåæã€ãã¬ãŒã¿ãŒã®æ§ç¯ïŒãªã¢ã«ã¿ã€ã ããŒã¿ãã£ãŒã
WebSocketsããã®ãªã¢ã«ã¿ã€ã ã€ãã³ããã£ãŒããã«ã¹ã¿ã ã¡ãã»ãŒãžãã¥ãŒãªã©ãã«ã¹ã¿ã ããŒã¿ãœãŒã¹ãã¢ãã«åããããã«ç¬èªã®éåæã€ãã¬ãŒã¿ãŒãäœæã§ããŸãã
class WebSocketDataFeed {
constructor(url) {
this.url = url;
this.buffer = [];
this.waitingResolvers = [];
this.ws = null;
this.connect();
}
connect() {
this.ws = new WebSocket(this.url);
this.ws.onmessage = (event) => {
const data = JSON.parse(event.data);
if (this.waitingResolvers.length > 0) {
// If there's a consumer waiting, resolve immediately
const resolve = this.waitingResolvers.shift();
resolve({ value: data, done: false });
} else {
// Otherwise, buffer the data
this.buffer.push(data);
}
};
this.ws.onclose = () => {
// Signal completion or error to waiting consumers
while (this.waitingResolvers.length > 0) {
const resolve = this.waitingResolvers.shift();
resolve({ value: undefined, done: true }); // No more data
}
};
this.ws.onerror = (error) => {
console.error('WebSocket Error:', error);
// Propagate error to consumers if any are waiting
};
}
// Make this class an async iterable
[Symbol.asyncIterator]() {
return this;
}
// The core async iterator method
async next() {
if (this.buffer.length > 0) {
return { value: this.buffer.shift(), done: false };
} else if (this.ws && this.ws.readyState === WebSocket.CLOSED) {
return { value: undefined, done: true };
}
else {
// No data in buffer, wait for the next message
return new Promise(resolve => this.waitingResolvers.push(resolve));
}
}
// Optional: Clean up resources if iteration stops early
async return() {
if (this.ws && this.ws.readyState === WebSocket.OPEN) {
console.log('Closing WebSocket connection.');
this.ws.close();
}
return { value: undefined, done: true };
}
}
async function processRealtimeMarketData() {
// Example: Imagine a global market data WebSocket feed
const marketDataFeed = new WebSocketDataFeed('wss://marketdata.example.com/live');
let totalTrades = 0;
console.log('Connecting to real-time market data feed...');
try {
for await (const trade of marketDataFeed) {
totalTrades++;
console.log(`New Trade: ${trade.symbol}, Price: ${trade.price}, Volume: ${trade.volume}`);
if (totalTrades >= 10) {
console.log('Processed 10 trades. Stopping for demonstration.');
break; // Stop iteration, triggering marketDataFeed.return()
}
// Simulate some asynchronous processing of the trade data
await new Promise(resolve => setTimeout(resolve, 100));
}
} catch (error) {
console.error('Error processing market data:', error);
} finally {
console.log(`Total trades processed: ${totalTrades}`);
}
}
// To run (in a browser environment or Node.js with a WebSocket library):
// processRealtimeMarketData();
ãã®ã«ã¹ã¿ã éåæã€ãã¬ãŒã¿ãŒã¯ãã€ãã³ãé§ååããŒã¿ãœãŒã¹ïŒWebSocketãªã©ïŒãéåæã€ãã©ãã«ã«ã©ããããfor await...ofã§æ¶è²»ã§ããããã«ããæ¹æ³ã瀺ããŠããŸããããã¯ããããã¡ãªã³ã°ãšæ°ããããŒã¿ã®åŸ
æ©ãåŠçããæç€ºçãªèå§å¶åŸ¡ãšreturn()ãä»ãããªãœãŒã¹ã¯ãªãŒã³ã¢ããã瀺ããŠããŸãããã®ãã¿ãŒã³ã¯ãã©ã€ãããã·ã¥ããŒããç£èŠã·ã¹ãã ããŸãã¯äžçã®ããããå Žæããçºçããã€ãã³ãã®ç¶ç¶çãªã¹ããªãŒã ãåŠçããå¿
èŠãããéä¿¡ãã©ãããã©ãŒã ãªã©ã®ãªã¢ã«ã¿ã€ã ã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠéåžžã«åŒ·åã§ãã
é«åºŠãªæé©åææ³
åºæ¬çãªäœ¿çšæ³ã§ã倧ããªã¡ãªããããããŸããããããªãæé©åã«ãããè€éãªã¹ããªãŒã åŠçã·ããªãªã§ããã«åªããããã©ãŒãã³ã¹ãåŒãåºãããšãã§ããŸãã
1. éåæã€ãã¬ãŒã¿ãŒãšãã€ãã©ã€ã³ã®æ§æ
åæã€ãã¬ãŒã¿ãŒãšåæ§ã«ãéåæã€ãã¬ãŒã¿ãŒãæ§æããŠåŒ·åãªããŒã¿åŠçãã€ãã©ã€ã³ãäœæã§ããŸãããã€ãã©ã€ã³ã®åã¹ããŒãžã¯ãåã®ã¹ããŒãžããã®ããŒã¿ã倿ãŸãã¯ãã£ã«ã¿ãªã³ã°ããéåæãžã§ãã¬ãŒã¿ãŒã«ãªããŸãã
// A generator that simulates fetching raw data
async function* fetchDataStream() {
const data = [
{ id: 1, tempC: 25, location: 'Tokyo' },
{ id: 2, tempC: 18, location: 'London' },
{ id: 3, tempC: 30, location: 'Dubai' },
{ id: 4, tempC: 22, location: 'New York' },
{ id: 5, tempC: 10, location: 'Moscow' }
];
for (const item of data) {
await new Promise(resolve => setTimeout(resolve, 50)); // Simulate async fetch
yield item;
}
}
// A transformer that converts Celsius to Fahrenheit
async function* convertToFahrenheit(source) {
for await (const item of source) {
const tempF = (item.tempC * 9/5) + 32;
yield { ...item, tempF };
}
}
// A filter that selects data from warmer locations
async function* filterWarmLocations(source, thresholdC) {
for await (const item of source) {
if (item.tempC > thresholdC) {
yield item;
}
}
}
async function processSensorDataPipeline() {
const rawData = fetchDataStream();
const fahrenheitData = convertToFahrenheit(rawData);
const warmFilteredData = filterWarmLocations(fahrenheitData, 20); // Filter > 20C
console.log('Processing sensor data pipeline:');
for await (const processedItem of warmFilteredData) {
console.log(`Location: ${processedItem.location}, Temp C: ${processedItem.tempC}, Temp F: ${processedItem.tempF}`);
}
console.log('Pipeline complete.');
}
// To run:
// processSensorDataPipeline();
Node.jsã¯ãŸããstream/promisesã¢ãžã¥ãŒã«ãšpipeline()ãæäŸããŠãããããã¯Node.jsã¹ããªãŒã ïŒå€ãã®å Žåéåæã€ãã¬ãŒã¿ãŒã«å€æå¯èœïŒãæ§æããããã®å
ç¢ãªæ¹æ³ãæäŸããŸãããã®ã¢ãžã¥ãŒã«æ§ã¯ãç°ãªãå°åã®ããŒã¿åŠçèŠä»¶ã«é©å¿ã§ãããè€éã§ä¿å®å¯èœãªããŒã¿ãããŒãæ§ç¯ããã®ã«åªããŠããŸãã
2. æäœã®äžŠååïŒæ³šæããŠïŒ
for await...ofã¯é 次åŠçã§ãããã€ãã¬ãŒã¿ãŒã®next()ã¡ãœããå
ã§è€æ°ã®é
ç®ãåæã«ãã§ããããããé
ç®ã®ãããã§Promise.all()ãªã©ã®ããŒã«ã䜿çšãããããããšã§ãããçšåºŠã®äžŠåæ§ãå°å
¥ã§ããŸãã
async function* parallelFetchPages(baseUrl, initialParams = {}, concurrency = 3) {
let currentPage = 1;
let hasMore = true;
const fetchPage = async (pageNumber) => {
const params = new URLSearchParams({ ...initialParams, page: pageNumber });
const url = `${baseUrl}?${params.toString()}`;
console.log(`Initiating fetch for page ${pageNumber} from ${url}`);
const response = await fetch(url);
if (!response.ok) {
throw new Error(`API error on page ${pageNumber}: ${response.statusText}`);
}
return response.json();
};
let pendingFetches = [];
// Start with initial fetches up to concurrency limit
for (let i = 0; i < concurrency && hasMore; i++) {
pendingFetches.push(fetchPage(currentPage++));
if (currentPage > 5) hasMore = false; // Simulate limited pages for demo
}
while (pendingFetches.length > 0) {
const { resolved, index } = await Promise.race(
pendingFetches.map((p, i) => p.then(data => ({ resolved: data, index: i })))
);
// Process items from the resolved page
for (const item of resolved.items) {
yield item;
}
// Remove resolved promise and potentially add a new one
pendingFetches.splice(index, 1);
if (hasMore) {
pendingFetches.push(fetchPage(currentPage++));
if (currentPage > 5) hasMore = false; // Simulate limited pages for demo
}
}
}
async function processHighVolumeAPIData() {
const apiEndpoint = "https://api.example.com/high-volume-data";
console.log('Processing high-volume API data with limited concurrency...');
try {
for await (const item of parallelFetchPages(apiEndpoint, {}, 3)) {
console.log(`Processed item: ${JSON.stringify(item)}`);
// Simulate heavy processing
await new Promise(resolve => setTimeout(resolve, 200));
}
console.log('High-volume API data processing complete.');
} catch (error) {
console.error(`Error in high-volume API data processing: ${error.message}`);
}
}
// To run:
// processHighVolumeAPIData();
ãã®äŸã§ã¯ãPromise.raceã䜿çšããŠäžŠè¡ãªã¯ãšã¹ãã®ããŒã«ã管çãã1ã€ãå®äºãããšããã«æ¬¡ã®ããŒãžããã§ããããŸããããã«ãããé«é
å»¶ã®ã°ããŒãã«APIããã®ããŒã¿åã蟌ã¿ã倧å¹
ã«é«éåãããŸãããAPIãµãŒããŒãŸãã¯ç¬èªã®ã¢ããªã±ãŒã·ã§ã³ã®ãªãœãŒã¹ãå§åããªãããã«ãäžŠè¡æ§å¶éã®æ
éãªç®¡çãå¿
èŠã§ãã
3. ãããæäœ
åå¥ã«é ç®ãåŠçããããšã¯ãç¹ã«å€éšã·ã¹ãã ïŒããŒã¿ããŒã¹ãžã®æžã蟌ã¿ããã¥ãŒãžã®ã¡ãã»ãŒãžéä¿¡ãäžæ¬APIåŒã³åºããªã©ïŒãšå¯Ÿè©±ããå Žåã«éå¹ççã«ãªãããšããããŸããéåæã€ãã¬ãŒã¿ãŒã¯ãåŠçåã«é ç®ããããåŠçããããã«äœ¿çšã§ããŸãã
async function* batchItems(source, batchSize) {
let batch = [];
for await (const item of source) {
batch.push(item);
if (batch.length >= batchSize) {
yield batch;
batch = [];
}
}
if (batch.length > 0) {
yield batch;
}
}
async function processBatchedUpdates(dataStream) {
console.log('Processing data in batches for efficient writes...');
for await (const batch of batchItems(dataStream, 5)) {
console.log(`Processing batch of ${batch.length} items: ${JSON.stringify(batch.map(i => i.id))}`);
// Simulate a bulk database write or API call
await new Promise(resolve => setTimeout(resolve, 500));
}
console.log('Batch processing complete.');
}
// Dummy data stream for demonstration
async function* dummyItemStream() {
for (let i = 1; i <= 12; i++) {
await new Promise(resolve => setTimeout(resolve, 10));
yield { id: i, value: `data_${i}` };
}
}
// To run:
// processBatchedUpdates(dummyItemStream());
ãããåŠçã¯ãI/Oæäœã®æ°ãå€§å¹ ã«åæžããApache Kafkaã®ãããªåæ£ãã¥ãŒãžã®ã¡ãã»ãŒãžéä¿¡ããã°ããŒãã«ã«è€è£œãããããŒã¿ããŒã¹ãžã®äžæ¬æ¿å ¥ãªã©ã®æäœã®ã¹ã«ãŒããããåäžãããããšãã§ããŸãã
4. å ç¢ãªãšã©ãŒåŠç
广çãªãšã©ãŒåŠçã¯ãããããæ¬çªã·ã¹ãã ã«ãšã£ãŠäžå¯æ¬ ã§ããéåæã€ãã¬ãŒã¿ãŒã¯ãã³ã³ã·ã¥ãŒããŒã«ãŒãå
ã®ãšã©ãŒã«å¯ŸããŠæšæºã®try...catchãããã¯ãšããçµ±åãããŸããããã«ããããã¥ãŒãµãŒïŒéåæã€ãã¬ãŒã¿ãŒèªäœïŒã¯ãšã©ãŒãã¹ããŒããããšãã§ããããã¯ã³ã³ã·ã¥ãŒããŒã«ãã£ãŠææãããŸãã
async function* unreliableDataSource() {
for (let i = 0; i < 5; i++) {
await new Promise(resolve => setTimeout(resolve, 100));
if (i === 2) {
throw new Error('Simulated data source error at item 2');
}
yield i;
}
}
async function consumeUnreliableData() {
console.log('Attempting to consume unreliable data...');
try {
for await (const data of unreliableDataSource()) {
console.log(`Received data: ${data}`);
}
} catch (error) {
console.error(`Caught error from data source: ${error.message}`);
// Implement retry logic, fallback, or alert mechanisms here
} finally {
console.log('Unreliable data consumption attempt finished.');
}
}
// To run:
// consumeUnreliableData();
ãã®ã¢ãããŒãã«ãããéäžåã®ãšã©ãŒåŠçãå¯èœã«ãªããè€æ°ã®ããŒã¿ã»ã³ã¿ãŒãã¯ã©ãŠããªãŒãžã§ã³ã«ãŸããã忣ã·ã¹ãã ã§äžè¬çãªäžæçãªé害ã«å¯ŸåŠããããã«äžå¯æ¬ ãªãå詊è¡ã¡ã«ããºã ããµãŒããããã¬ãŒã«ãŒã®å®è£ ã容æã«ãªããŸãã
ããã©ãŒãã³ã¹ã«é¢ããèæ ®äºé ãšãã³ãããŒãã³ã°
éåæã€ãã¬ãŒã¿ãŒã¯ã¹ããªãŒã åŠçã«ãããŠéèŠãªã¢ãŒããã¯ãã£äžã®å©ç¹ãæäŸããŸããããã®ããã©ãŒãã³ã¹ç¹æ§ãçè§£ããããšãéèŠã§ãã
- ãªãŒããŒãããïŒ Promiseãš
async/awaitæ§æã«ã¯ãçã®ã³ãŒã«ããã¯ãé«åºŠã«æé©åãããã€ãã³ããšããã¿ãŒãšæ¯èŒããŠãåºæã®ãªãŒããŒãããããããŸããéåžžã«é«ãã¹ã«ãŒããããšäœãé å»¶ã䌎ããéåžžã«å°ããªããŒã¿ãã£ã³ã¯ã®ã·ããªãªã§ã¯ããã®ãªãŒããŒãããã¯æž¬å®å¯èœãããããŸããã - ã³ã³ããã¹ãã¹ã€ããã³ã°ïŒ å
awaitã¯ãã€ãã³ãã«ãŒãã«ãããæœåšçãªã³ã³ããã¹ãã¹ã€ããã衚ããŸããéããããã³ã°ã§ãããäºçްãªã¿ã¹ã¯ã®é »ç¹ãªã³ã³ããã¹ãã¹ã€ããã³ã°ã¯ç©ã¿éãªãå¯èœæ§ããããŸãã - 䜿çšãã¹ãæïŒ éåæã€ãã¬ãŒã¿ãŒã¯ãI/OããŠã³ãæäœïŒãããã¯ãŒã¯ããã£ã¹ã¯ïŒããããŒã¿ãæ¬è³ªçã«æéçµéãšãšãã«å©çšå¯èœã«ãªãæäœãæ±ãå Žåã«èŒããæŸã¡ãŸãããããã¯çã®CPUé床ããããå¹ççãªãªãœãŒã¹ç®¡çãšå¿çæ§ã«é¢ãããã®ã§ãã
ãã³ãããŒãã³ã°ïŒ åžžã«ç¹å®ã®ãŠãŒã¹ã±ãŒã¹ããã³ãããŒã¯ããŠãã ãããNode.jsã®çµã¿èŸŒã¿perf_hooksã¢ãžã¥ãŒã«ããã©ãŠã¶ã®éçºè
ããŒã«ã䜿çšããŠããã©ãŒãã³ã¹ããããã¡ã€ãªã³ã°ããŸããå®éã®ã¢ããªã±ãŒã·ã§ã³ã®ã¹ã«ãŒããããã¡ã¢ãªäœ¿çšéãããã³çŸå®çãªè² è·æ¡ä»¶äžã§ã®é
å»¶ã«çŠç¹ãåœãŠãå®äžçã®ã¡ãªããïŒèå§åŠçãªã©ïŒãåæ ããªãå¯èœæ§ã®ãããã€ã¯ããã³ãããŒã¯ã§ã¯ãããŸããã
ã°ããŒãã«ãªåœ±é¿ãšå°æ¥ã®ãã¬ã³ã
ãJavaScriptéåæã€ãã¬ãŒã¿ãŒã»ããã©ãŒãã³ã¹ãšã³ãžã³ãã¯ãåãªãèšèªæ©èœã§ã¯ãªããæ å ±ã«ããµããäžçã§ããŒã¿åŠçã«ã©ã®ããã«ã¢ãããŒãããããšãããã©ãã€ã ã·ããã§ãã
- ãã€ã¯ããµãŒãã¹ãšãµãŒããŒã¬ã¹ïŒ éåæã€ãã¬ãŒã¿ãŒã¯ãã€ãã³ãã¹ããªãŒã ãä»ããŠéä¿¡ããããå€§èŠæš¡ãªãã€ããŒããéåæã§åŠçããããããå ç¢ã§ã¹ã±ãŒã©ãã«ãªãã€ã¯ããµãŒãã¹ã®æ§ç¯ãç°¡çŽ åããŸãããµãŒããŒã¬ã¹ç°å¢ã§ã¯ãäžæçãªã¡ã¢ãªå¶éã䜿ãæããããšãªãã颿°ããã倧ããªããŒã¿ã»ãããå¹ççã«åŠçã§ããããã«ããŸãã
- IoTããŒã¿éçŽïŒ ã°ããŒãã«ã«å±éãããæ°çŸäžã®IoTããã€ã¹ããã®ããŒã¿ãéçŽããã³åŠçããå Žåãéåæã€ãã¬ãŒã¿ãŒã¯ãç¶ç¶çãªã»ã³ãµãŒããŒã¿ãååŸããã³ãã£ã«ã¿ãªã³ã°ããã®ã«èªç¶ã«é©åããŸãã
- AI/MLããŒã¿ãã€ãã©ã€ã³ïŒ æ©æ¢°åŠç¿ã¢ãã«çšã®å€§èŠæš¡ãªããŒã¿ã»ããã®æºåãšäŸçµŠã«ã¯ãè€éãªETLããã»ã¹ã䌎ãããšããããããŸããéåæã€ãã¬ãŒã¿ãŒã¯ããããã®ãã€ãã©ã€ã³ãã¡ã¢ãªå¹çã®è¯ãæ¹æ³ã§èª¿æŽã§ããŸãã
- WebRTCãšãªã¢ã«ã¿ã€ã éä¿¡ïŒ çŽæ¥éåæã€ãã¬ãŒã¿ãŒäžã«æ§ç¯ãããŠããããã§ã¯ãããŸããããã¹ããªãŒã åŠçãšéåæããŒã¿ãããŒã®åºç€ãšãªãæŠå¿µã¯WebRTCã«ãšã£ãŠäžå¯æ¬ ã§ãããã«ã¹ã¿ã éåæã€ãã¬ãŒã¿ãŒã¯ãªã¢ã«ã¿ã€ã ã®ãªãŒãã£ãª/ãããªãã£ã³ã¯ãåŠçããããã®ã¢ããã¿ãŒãšããŠæ©èœããå¯èœæ§ããããŸãã
- Webæšæºã®é²åïŒ Node.jsãšãã©ãŠã¶ã«ãããéåæã€ãã¬ãŒã¿ãŒã®æåã¯ãæ°ããWebæšæºã«åœ±é¿ãäžãç¶ããéåæã®ã¹ããªãŒã ããŒã¹ã®ããŒã¿åŠçãåªå ãããã¿ãŒã³ãä¿é²ããŠããŸãã
éåæã€ãã¬ãŒã¿ãŒãæ¡çšããããšã§ãéçºè ã¯ãããé«éã§ä¿¡é Œæ§ãé«ãã ãã§ãªããçŸä»£ã®ããŒã¿ã®åçã§å°ççã«åæ£ããæ§è³ªãåŠçããããã«æ¬è³ªçã«åªããŠããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãã
çµè«ïŒããŒã¿ã¹ããªãŒã ã®æªæ¥ãåãã
JavaScriptã®éåæã€ãã¬ãŒã¿ãŒã¯ããããã©ãŒãã³ã¹ãšã³ãžã³ããšããŠçè§£ããæŽ»çšããããšãçŸä»£ã®éçºè ã«ãšã£ãŠäžå¯æ¬ ãªããŒã«ã»ãããæäŸããŸãããããã¯ãããŒã¿ã¹ããªãŒã ã管çããããã®æšæºåãããããšã¬ã¬ã³ãã§ãéåžžã«å¹ççãªæ¹æ³ãæäŸããå¢ãç¶ããããŒã¿éãšã°ããŒãã«ãªåæ£ã®è€éãã«çŽé¢ããŠããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãå¿çæ§ãã¡ã¢ãªå¹çãç¶æããŸãã
é å»¶è©äŸ¡ãæé»ã®èå§ãã€ã³ããªãžã§ã³ããªãªãœãŒã¹ç®¡çãæ¡çšããããšã§ãããŒã«ã«ãã¡ã€ã«ãã倧éžã«ãŸãããããŒã¿ãã£ãŒããŸã§ã楜ã«ã¹ã±ãŒã«ããã·ã¹ãã ãæ§ç¯ã§ãããã€ãŠã¯è€éãªèª²é¡ã§ãã£ããã®ããåçåãããæé©åãããããã»ã¹ã«å€ããããšãã§ããŸãã仿¥ããéåæã€ãã¬ãŒã¿ãŒã詊ããŠãJavaScriptã¢ããªã±ãŒã·ã§ã³ã§æ°ããã¬ãã«ã®ããã©ãŒãã³ã¹ãšå埩åãè§£ãæŸã¡ãŸãããã